import express  from  'express';  
import {  validationResult } from 'express-validator'; // express对于接收的参数进行约束检测的工具 
import { PrismaClient } from '@prisma/client';         // prisma 是我们操作数据库的一个ORM库
import jwt from 'jsonwebtoken';                        // token工具
import path from 'path'                         
import { dirname } from "node:path"
import { fileURLToPath } from "node:url"
import 'express-async-errors';
import cors from 'cors'
import NodeCache from 'node-cache';                     // 服务端的本地缓存类库
const _cache = new NodeCache();

// 引入我们的控制器
import UserRouter from './controller/user.js'
import PatientRouter from './controller/patient.js'
import BookRouter from './controller/book.js'


const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = express();  
app.use(cors());

const PORT = 3001;      
const prisma = new PrismaClient()                          // 实例化一个 prisma 操作实例

// 设置静态文件目录  
app.use(express.static(path.join(__dirname, 'public')));   // 设置静态访问目录
// 格式化 请求的body参数 转换成json格式 挂载在 req.body上
app.use(express.json())                     
app.use(express.urlencoded({extended:false}))


// 一些自己配置的中间件
app.use((req,res,next)=>{
    // 使用Prisma
    req.prisma = prisma

    // 通用请求响应方式
    res.success = (data)=>{
        res.json({
            success: true,
            data
        })
    }
    res.fail = (error)=>{
        res.status(200).json({
            success: false,
            info: error
        })
    }
    // 缓存cache
    req.nodeCache = _cache;

    // 执行类型检测
    res.validator = ()=>{
      const error = validationResult(req).array({ onlyFirstError: true });
      if(error.length)  {
         res.fail(error[0].msg) 
         res.end();
      }
    }

    next()
})
  

  
// 验证JWT令牌  
const whiteList = [
  '/login',
  '/reg',
  '/sendcode'
];
function verifyToken(req, res, next) {  

  if(whiteList.includes(req.path)){
    return next();
  }
  const secretKey = 'qfdixon'; // 替换为你的密钥  
  const token = req.headers['authorization'];  
  if (!token) return res.sendStatus(401);  
  jwt.verify(token.split(' ')[1], secretKey, (err, _res) => {  
    console.log('err',err)
    if (err) return res.sendStatus(403);  
    req.user = res.user;  
    next();  
  });  
}  


// 业务逻辑区域
app.use(UserRouter);
app.use(verifyToken, PatientRouter);
app.use(verifyToken, BookRouter);

  


// 全局捕获错误
const errorHandling = (err, req, res, next) => {
    res.status(500).json({
      msg: err.message,
      success: false,
    });

}
app.use(errorHandling);

  
// 启动应用程序  
app.listen(PORT, () => {  
  console.log(`Server is running on port ${PORT}`);  
});



